/*******************************************************************************
 * $Header: /home/cvsroot/develop/workspace/base/com.ease.java/src/com/ease/system/exception/impl/ExceptionMessageHelper.java,v 1.1 2012/09/26 16:17:27 liwei Exp $
 * $Revision: 1.1 $
 * $Date: 2012/09/26 16:17:27 $
 *
 *==============================================================================
 *
 * Copyright (c) 2001-2006 Primeton Technologies, Ltd.
 * All rights reserved.
 *
 * Created on Nov 6, 2010
 *******************************************************************************/

package com.ease.aa.system.exception.impl;

import java.io.InputStream;
import java.net.URL;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;

import com.ease.aa.system.utility.impl.MetainfResources;
import com.ease.aa.system.utility.impl.MetainfResources.ILoadAction;

/**
 * 异常国际化帮助类.<br>
 * 
 * @author nathanleewei
 */
public class ExceptionMessageHelper {

	private static final String META_INF_ROOT = "META-INF/resources/";

	private static final String EXCEPTION_RESOURCE_PREFIX = "ExceptionResource";
	private static final String EXCEPTION_RESOURCE_SUFFIX = ".properties";

	private static final String DEFAULT_EXCEPTION_RESOURCE = "ExceptionResource.properties";

	private static boolean loaded = false;

	/**
	 * 获取国际化的异常信息,根据{@link Locale#getDefault()}返回对应的国际化信息.<br>
	 * 
	 * @param key
	 *            异常编码
	 * @return 对应的异常信息
	 */
	public static String getMessage(String key) {
		return getMessage(key, Locale.getDefault());
	}

	/**
	 * 获取国际化的异常信息.<br>
	 * 
	 * @param key
	 *            异常编码
	 * @param locale
	 *            语言
	 * @return 对应的异常信息
	 */
	public static String getMessage(String key, Locale locale) {
		if (!loaded) {
			loadMessageResources(Thread.currentThread().getContextClassLoader());
		}
		String message = null;
		Properties prop = ExceptionResourceCache.getLocaleProperties(locale);
		if (null != prop) {
			message = prop.getProperty(key);
		}

		if (null == message) {
			prop = ExceptionResourceCache.getDefaultProperties();
			if (null != prop) {
				message = prop.getProperty(key);
			}
		}
		return message;
	}

	/**
	 * 格式化字符串,根据给定的参数信息.<br>
	 * 
	 * @param s
	 *            需要格式化的字符串
	 * @param params
	 *            参数信息
	 * @return 格式化后的字符串
	 */
	public static String format(String s, Object[] params) {
		if (!loaded) {
			loadMessageResources(Thread.currentThread().getContextClassLoader());
		}
		String message = s;
		if (message == null) {
			return "";
		}
		if (params != null && params.length > 0) {
			message = new MessageFormat(message).format(params);
		}
		return message;
	}

	/**
	 * 加载类加载器能找到的异常资源文件.<br>
	 * 
	 * @param classLoader
	 *            类加载器
	 */
	public static synchronized void loadMessageResources(ClassLoader classLoader) {
		if (loaded) {
			return;
		}
		Map<String, Locale> localeResources = getAvailableLocaleResources();
		for (Entry<String, Locale> entry : localeResources.entrySet()) {
			loadMessageResource(classLoader, entry.getKey(), entry.getValue());
		}
		loaded = true;
	}

	private static Map<String, Locale> getAvailableLocaleResources() {
		Map<String, Locale> result = new HashMap<String, Locale>();
		// Locale[] availableLocales = Locale.getAvailableLocales();
		Locale[] availableLocales = new Locale[2];
		availableLocales[0] = Locale.getDefault();
		availableLocales[1] = Locale.ENGLISH;
		String resource = null;
		for (int i = 0; i < availableLocales.length; i++) {
			resource = META_INF_ROOT + EXCEPTION_RESOURCE_PREFIX + "_" + availableLocales[i].toString() + EXCEPTION_RESOURCE_SUFFIX;
			result.put(resource, availableLocales[i]);
		}
		result.put(META_INF_ROOT + DEFAULT_EXCEPTION_RESOURCE, null);
		return result;
	}

	private static void loadMessageResource(ClassLoader classLoader, String messageResource, final Locale locale) {
		MetainfResources.load(classLoader, messageResource, new ILoadAction() {
			public Object run(int idx, String metaInfResource, URL url) throws Exception {
				register(url, locale);
				return null;
			}
		});
	}

	private static void register(URL url, Locale locale) throws Exception {
		InputStream in = null;
		try {
			in = url.openStream();
			Properties prop = new Properties();
			prop.load(in);
			if (null == locale) {
				ExceptionResourceCache.setDefaultProperties(prop);
			} else {
				ExceptionResourceCache.addLocaleProperties(locale, prop);
			}
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (Exception e) {
					// ignore
				}
			}
		}
	}
}

/*
 * 修改历史 $Log: ExceptionMessageHelper.java,v $ 修改历史 Revision 1.1 2012/09/26 16:17:27 liwei 修改历史 init 修改历史 修改历史 Revision
 * 1.1 2012/09/09 10:16:53 liwei 修改历史 init 修改历史 修改历史 Revision 1.1 2012/09/09 09:32:25 liwei 修改历史 init 修改历史 修改历史 Revision
 * 1.1 2012/09/07 05:52:00 liwei 修改历史 init 修改历史 修改历史 Revision 1.1 2012/05/30 09:56:31 liwei 修改历史 *** empty log message
 * *** 修改历史 修改历史 Revision 1.4 2012/03/19 17:42:30 liwei 修改历史 init 修改历史 修改历史 Revision 1.3 2012/03/13 20:24:08 liwei 修改历史
 * init 修改历史 修改历史 Revision 1.2 2012/03/01 06:28:11 liwei 修改历史 init 修改历史 修改历史 Revision 1.1 2012/02/28 07:13:16 liwei 修改历史
 * init 修改历史 Revision 1.1 2011/08/19 08:37:29 chengy Add:
 * 增加先从类路径的META-INF/resources/ExceptionResource_xxx.properties加载异常的资源文件能力
 * 
 * Revision 1.1 2011/08/08 08:10:26 chengy Add: 从BTP6.1迁移到技术平台
 * 
 * Revision 1.3 2011/03/09 01:56:56 wangwb Update:增加synchronized
 * 
 * Revision 1.2 2010/12/30 01:06:02 wangwb Update:修改常量名称
 * 
 * Revision 1.1 2010/12/20 03:43:39 wangwb Add:迁移CVS
 * 
 * Revision 1.1 2010/11/29 00:44:22 wangwb Update:迁移CVS
 * 
 * Revision 1.1 2010/11/10 03:12:14 wangwb Add:移动CVS库
 * 
 * Revision 1.2 2010/11/08 05:44:00 wangwb Update:更新异常
 * 
 * Revision 1.1 2010/11/08 00:25:28 wangwb Update:更新
 */